2 // FPUIExtensionCommunicationService.swift
5 // Created by Claudio Cambra on 21/2/24.
11 import NextcloudFileProviderKit
14 class FPUIExtensionServiceSource: NSObject, NSFileProviderServiceSource, NSXPCListenerDelegate, FPUIExtensionService {
15 let listener = NSXPCListener.anonymous()
16 let serviceName = fpUiExtensionServiceName
17 let fpExtension: FileProviderExtension
19 init(fpExtension: FileProviderExtension) {
20 Logger.fpUiExtensionService.debug("Instantiating FPUIExtensionService service")
21 self.fpExtension = fpExtension
25 func makeListenerEndpoint() throws -> NSXPCListenerEndpoint {
26 listener.delegate = self
28 return listener.endpoint
32 _ listener: NSXPCListener,
33 shouldAcceptNewConnection newConnection: NSXPCConnection
35 newConnection.exportedInterface = NSXPCInterface(with: FPUIExtensionService.self)
36 newConnection.exportedObject = self
37 newConnection.resume()
41 //MARK: - FPUIExtensionService protocol methods
43 func credentials() async -> NSDictionary {
44 return (fpExtension.ncAccount?.dictionary() ?? [:]) as NSDictionary
47 func itemServerPath(identifier: NSFileProviderItemIdentifier) async -> NSString? {
48 let rawIdentifier = identifier.rawValue
49 Logger.shares.info("Fetching shares for item \(rawIdentifier, privacy: .public)")
51 guard let baseUrl = fpExtension.ncAccount?.davFilesUrl else {
52 Logger.shares.error("Could not fetch shares as ncAccount on parent extension is nil")
56 let dbManager = FilesDatabaseManager.shared
57 guard let item = dbManager.itemMetadataFromFileProviderItemIdentifier(identifier) else {
58 Logger.shares.error("No item \(rawIdentifier, privacy: .public) in db, no shares.")
62 let completePath = item.serverUrl + "/" + item.fileName
63 return completePath.replacingOccurrences(of: baseUrl, with: "") as NSString